package com.xrit.sunnyday.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.StringUtil;
import com.xrit.sunnyday.dao.CheckGroupDao;
import com.xrit.sunnyday.entity.PageResult;
import com.xrit.sunnyday.entity.QueryPageBean;
import com.xrit.sunnyday.exception.SunnydayException;
import com.xrit.sunnyday.pojo.CheckGroup;
import com.xrit.sunnyday.service.CheckGroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

@Service(interfaceClass = CheckGroupService.class)
public class CheckGroupServiceImpl implements CheckGroupService{
    @Autowired
    private CheckGroupDao checkGroupDao;

    @Override
    @Transactional
    public void add(CheckGroup checkGroup, Integer[] checkitemIds) {
        //1.先添加检查组
        checkGroupDao.add(checkGroup);
        //2.获取检查组的id
        Integer checkGroupId = checkGroup.getId();
        //如果用户勾选，就要添加检查组和检查项的关联关系(干到多对多的第三张表)
        if(null!=checkitemIds){
            //用户有勾选
            for (Integer checkitemId:checkitemIds){
                //现在有了checkGroupId，有了checkitemId
                //下一步：将他们的关联关系干到第三张表对应即可
                checkGroupDao.addCheckGroupChenckItem(checkGroupId,checkitemId);
            }
        }

    }

    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        //开启分页
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());
        //今天搞点不一样的，模糊查询
        if(!StringUtil.isEmpty(queryPageBean.getQueryString())){
            //在java代码里处理%
            queryPageBean.setQueryString("%"+queryPageBean.getQueryString()+"%");
        }
        //紧接着查询就会被分页
        Page<CheckGroup> page =  checkGroupDao.findByCondition(queryPageBean.getQueryString());
        return new PageResult(page.getTotal(),page.getResult());
    }

    @Override
    public CheckGroup findById(int chekgroupId) {
        return checkGroupDao.findById(chekgroupId);
    }
    @Override
    public List<Integer> findCheckItemIdByCheckGroupId(int checkGroupId) {
        return checkGroupDao.findCheckItemIdByCheckGroupId(checkGroupId);
    }
    @Override
    @Transactional
    public void update(CheckGroup checkGroup, Integer[] checkitemIds) {
        //1.先更新检查组，将编辑的检查组作为参数传入
        checkGroupDao.update(checkGroup);
        //2.删除旧的检查组和检查项的关系
        checkGroupDao.deleteCheckGroupCheckItem(checkGroup.getId());
        //3.再建立新的关联
        if (null!=checkitemIds){
            for (Integer checkitemId:checkitemIds){
                checkGroupDao.addCheckGroupChenckItem(checkGroup.getId(),checkitemId);
            }
        }
    }

    /**
     * 删除检查组
     */
    @Override
    @Transactional  //设计到多表，务必使用事务
    public void deleteById(int id){
        //1.判断该检查组是否由被套餐使用(思路：查找是否关联往上一层关系！)
        int count = checkGroupDao.findSetmealCountByGroupId(id);
        if (count>0){
            //2.如果第三张表中有值，则抛出异常
            throw new SunnydayException("该检查组关联着套餐，不能删除");
        }
        //3.没有被上一级的套餐使用，就可以删除数据(思路：解除下一层关系！)
        checkGroupDao.deleteCheckGroupCheckItem(id);
        //4.最后再删除检查组
        checkGroupDao.deleteById(id);
    }

    /**
     * 查询所有检查组
     */
    @Override
    public List<CheckGroup> findAll() {
        return checkGroupDao.findAll();
    }
}
